package smallfrench.moteur.lexer;

import smallfrench.moteur.lexer.err.ErreurLexer;
import smallfrench.moteur.lexer.lexemes.Lexeme;
import smallfrench.moteur.lexer.lexemes.TypeLexeme;

/**
 * Automate pour analyser les signes.
 * @author antoine1023
 *
 */
public class AutomateSignes extends Automate {

	@Override
	public Lexeme analyser(LecteurChaine lecteur, Position debut)
			throws ErreurLexer {

		char c = lecteur.suivant();

		TypeLexeme t = null;

		switch (c) {

		case '+':
			t = TypeLexeme.PLUS; break;
		case '-':
			t = TypeLexeme.MOINS; break;

		case '*':
			t = TypeLexeme.ETOILE; break;
		case '/':
			t = TypeLexeme.SLASH; break;

		case '=':
			t = TypeLexeme.EGAL_ASSIGN; break;

		case '{':
			t = TypeLexeme.ACCOLADE_OUVRANTE; break;
		case '}':
			t = TypeLexeme.ACCOLADE_FERMANTE; break;

		case '(':
			t = TypeLexeme.PARENTHESE_OUVRANTE; break;
		case ')':
			t = TypeLexeme.PARENTHESE_FERMANTE; break;

		case '[':
			t = TypeLexeme.CROCHET_OUVRANT; break;
		case ']':
			t = TypeLexeme.CROCHET_FERMANT; break;

		case '.':
			if (! lecteur.isEof()) {
				c = lecteur.suivant();
				if (c == '.') {
					t = TypeLexeme.POINT_POINT;
					break;
				}
				lecteur.precedent();
			}
			t = TypeLexeme.POINT;
			break;

		case ';':
			t = TypeLexeme.POINT_VIRGULE; break;
		case ':':
			t = TypeLexeme.DEUX_POINTS; break;
		}

		if (t != null)
			return new Lexeme(t, debut, lecteur.getPosition());

		lecteur.precedent();
		return null;
	}

}
